#include "Game.h"
#include "PathManager.h"

#include "Event.h"

PathManager::PathManager(void)
	{
		G_EVENTOS->addListener(CARGANDO_MAPA,this);
		G_EVENTOS->addListener(PETICION_RUTA,this);
	}

bool PathManager::onEvent( Event *e )
	{

		if (e->tipo == CARGANDO_MAPA){
			eventoCargaMapa *eData = (eventoCargaMapa *)e->datos;
			mapa = eData->map;

			hash_map<ID,PathFinder*>::iterator it;	
			for (it = rutasEnActivo.begin(); it != rutasEnActivo.end();++it)
				delete it->second;
			
			rutasEnActivo.clear();
		}
		else if (e->tipo == PETICION_RUTA){//le buscamos una ruta
			//si ya habia pedido una, la eliminamos
			
			eventoPeticionRuta *eData = (eventoPeticionRuta*)e->datos;
			if (rutasEnActivo[eData->actor->getID()] != NULL){
				delete rutasEnActivo[eData->actor->getID()];
				rutasEnActivo.erase(eData->actor->getID());
				cout << "Ruta cancelada" << endl;
			}
				
			PathFinder *p = new PathFinder(eData->inicioX,eData->inicioY,eData->destinoX,eData->destinoY,mapa);
			rutasEnActivo[eData->actor->getID()] = p;

			return true;
		}
		return false;
		
	}

void PathManager::update()
	{
	int cantidad = g->getFPS()->getSpeed()*32.f;
	hash_map<ID,PathFinder*>::iterator it;
	
	
	for (it = rutasEnActivo.begin(); it != rutasEnActivo.end();++it){
		PathFinder *pr = it->second;
		if (pr->getStatus() != PathFinding::PROCESANDO){
			if (PathFinding::LISTO == pr->getStatus()){
				eventoRutaGenerada *EV = new eventoRutaGenerada(it->first,pr->getPath(),PathFinding::LISTO);
				G_EVENTOS->enviarEvento( new Event(RUTA_GENERADA, EV));
			}else if (pr->getStatus() == PathFinding::IMPOSIBLE){
				cout << "Destino no alcanzable. Pasos totales: " << pr->getTotalSteps() << endl;
				eventoRutaGenerada *EV = new eventoRutaGenerada(it->first,NULL,PathFinding::IMPOSIBLE);
				G_EVENTOS->enviarEvento( new Event(RUTA_GENERADA, EV));
			}
			delete pr;
			rutasEnActivo.erase(it);
		}
		break;
	}



	for (it = rutasEnActivo.begin(); it != rutasEnActivo.end();++it)
		it->second->procesar(cantidad);

	}

void PathManager::nuevaRuta( int xInicio, int yInicio, int xDestino, int yDestino )
	{
		
	}

PathManager::~PathManager(void)
	{
	}